package com.xlh.support.experimentshare.service;


import com.xlh.support.experimentshare.domain.ShareUser;
import com.xlh.support.experimentshare.vo.ExperimentUserVO;
import com.xlh.support.experimentshare.vo.ShareExperimentVO;
import com.xlh.support.experimentshare.vo.ShareUserVO;
import com.xlh.virtualization.domain.ExperimentContainer;

import java.util.List;

/**
 * @author cheer
 */
public interface ExperimentShareService {

    /**
     * 查询实验用户
     *
     * @param userId    用户Id
     * @param isTeacher 是否为教师
     * @param chapterId 章节Id
     * @return 实验用户列表
     */
    List<ExperimentUserVO> listExperimentUsers(Long userId, Boolean isTeacher, Long chapterId);

    /**
     * 分享桌面
     *
     * @param shareUser     发起分享的用户
     * @param sharedUserIds 被分享的用户Id集合
     * @param controllable  分享对方是否可操作
     */
    void shareExperiment(ShareUser shareUser, List<Long> sharedUserIds, Boolean controllable);

    /**
     * 关闭分享桌面
     *
     * @param shareUser 关闭分享的用户
     */
    void closeShareExperiment(ShareUser shareUser);

    /**
     * 关闭分享桌面
     *
     * @param shareUsers 关闭分享的用户集合
     */
    void closeShareExperiment(List<ShareUser> shareUsers);

    /**
     * 查询分享实验
     *
     * @param userId 用户Id
     * @return 收到的分享实验列表
     */
    List<ShareUserVO> queryShareExperiment(Long userId);

    /**
     * 进入分享桌面
     *
     * @param userId    用户Id
     * @param shareUser 分享用户
     * @return 分享桌面
     */
    ShareExperimentVO enterShareExperiment(Long userId, ShareUser shareUser);

    /**
     * 删除分享桌面
     *
     * @param userId    用户Id
     * @param shareUser 分享用户
     */
    void deleteShareExperiment(Long userId, ShareUser shareUser);

    /**
     * 删除所有分享桌面
     *
     * @param userId 用户Id
     */
    void deleteAllShareExperiment(Long userId);

    /**
     * 关闭学生对学生的分享
     *
     * @param chapterId 章节Id
     */
    void closeStuToStuShare(Long chapterId);

    /**
     * 关闭学生对老师的分享
     *
     * @param chapterId 章节Id
     */
    void closeStuToTeaShare(Long chapterId);

    /**
     * 缓存用户实验信息
     *
     * @param shareUser            分享用户
     * @param experimentContainers 实验容器列表
     */
    void cacheShareExperiment(ShareUser shareUser, List<ExperimentContainer> experimentContainers);

    /**
     * 失效用户实验信息
     *
     * @param shareUser 分享用户
     */
    void invalidShareExperiment(ShareUser shareUser);

    /**
     * 通知分享者分享的桌面全屏
     *
     * @param shareUsers 分享用户
     * @param fullScreen 是否全屏
     */
    void notifyFullScreen(List<ShareUser> shareUsers, Boolean fullScreen);

    /**
     * 分享者切换窗口
     *
     * @param shareUser 分享用户
     * @param number    窗口号
     */
    void switchExperiment(ShareUser shareUser, Integer number);
}
